package coc.core.collector;

import java.util.ArrayList;
import java.util.List;

import coc.core.CrawlerCookie;

import com.gargoylesoftware.htmlunit.BrowserVersion;

import coo.base.exception.UncheckedException;

/**
 * 采集器工厂。
 */
public class CollectorFactory {
	/**
	 * 创建采集器。
	 * 
	 * @param collectorType
	 *            采集器类型
	 * @param timeout
	 *            超时时间
	 * @return 返回采集器实例。
	 */
	public static Collector createCollector(CollectorType collectorType,
			Integer timeout) {
		return createCollector(collectorType, timeout,
				new ArrayList<CrawlerCookie>(), BrowserVersion.getDefault());
	}

	/**
	 * 创建采集器。
	 * 
	 * @param collectorType
	 *            采集器类型
	 * @param timeout
	 *            超时时间
	 * @param cookies
	 *            Cookie
	 * @return 返回采集器实例。
	 */
	public static Collector createCollector(CollectorType collectorType,
			Integer timeout, List<CrawlerCookie> cookies) {
		return createCollector(collectorType, timeout, cookies,
				BrowserVersion.getDefault());
	}

	/**
	 * 创建采集器。
	 * 
	 * @param collectorType
	 *            采集器类型
	 * @param timeout
	 *            超时时间
	 * @param cookies
	 *            Cookie
	 * @param version
	 *            浏览器版本
	 * @return 返回采集器实例。
	 */
	public static Collector createCollector(CollectorType collectorType,
			Integer timeout, List<CrawlerCookie> cookies, BrowserVersion version) {
		if (collectorType == CollectorType.JSOUP) {
			JsoupCollector collector = new JsoupCollector(timeout);
			for (CrawlerCookie cookie : cookies) {
				collector.getConnection().cookie(cookie.getName(),
						cookie.getValue());
			}
			return collector;
		}
		if (collectorType == CollectorType.HTMLUNIT) {
			HtmlUnitCollector collector = new HtmlUnitCollector(timeout,
					version);
			for (CrawlerCookie cookie : cookies) {
				collector.getWebClient().getCookieManager()
						.addCookie(cookie.toHtmlUnit());
			}
			return collector;
		}
		throw new UncheckedException("没有找到类型为[" + collectorType.name()
				+ "]的采集器。");
	}
}
